package com.abigdreamer.im.client.util.cntospell;

import java.util.Date;
import java.util.LinkedHashMap;

/**
 * 
 * 汉字转化为全拼,码表利用输入法的码表导出，汉字信息非常全，平时见到的汉字
 * 转拼音的API只能处理几千个一级汉字，很多字都没有法查到，尤其是我自己的姓
 * 都查不到所以只好自己做一个汉字转拼音的API，该API除可以处理99％以上的汉字，
 * 而且可以返回多音字的读音
 */
public class CnToSpell {

	private static LinkedHashMap spellMap = null;

	static {
		if (spellMap == null) {
			spellMap = new LinkedHashMap(20901);
		}
		initialize();
	}

	private CnToSpell() {
	}

	protected static void spellPut(String ascii, String spells) {
		spellMap.put(ascii, spells);
	}
	

	private static void initialize() {
		SpellLib1.init0();
		SpellLib1.init1();
		SpellLib1.init2();
		SpellLib1.init3();
		SpellLib1.init4();
		SpellLib1.init5();
		SpellLib1.init6();
		SpellLib1.init7();
		SpellLib1.init8();
		SpellLib1.init9();
		SpellLib1.init10();
		SpellLib2.init11();
		SpellLib2.init12();
		SpellLib2.init13();
		SpellLib2.init14();
		SpellLib2.init15();
		SpellLib2.init16();
		SpellLib2.init17();
		SpellLib2.init18();
		SpellLib2.init19();
		SpellLib2.init20();
		SpellLib3.init21();
		SpellLib3.init22();
		SpellLib3.init23();
		SpellLib3.init24();
		SpellLib3.init25();
		SpellLib3.init26();
		SpellLib3.init27();
		SpellLib3.init28();
		SpellLib3.init29();
		SpellLib3.init30();
		SpellLib4.init31();
		SpellLib4.init32();
		SpellLib4.init33();
		SpellLib4.init34();
		SpellLib4.init35();
		SpellLib4.init36();
		SpellLib4.init37();
		SpellLib4.init38();
		SpellLib4.init39();
		SpellLib4.init40();
		SpellLib5.init41();
		SpellLib5.init42();
		SpellLib5.init43();
		SpellLib5.init44();
		SpellLib5.init45();
		SpellLib5.init46();
		SpellLib5.init47();
		SpellLib5.init48();
		SpellLib5.init49();
		SpellLib5.init50();
		SpellLib6.init51();
		SpellLib6.init52();
		SpellLib6.init53();
		SpellLib6.init54();
		SpellLib6.init55();
		SpellLib6.init56();
		SpellLib6.init57();
		SpellLib6.init58();
		SpellLib6.init59();
		SpellLib6.init60();
		
		SpellLib7.init61();
		SpellLib7.init62();
		SpellLib7.init63();
		SpellLib7.init64();
		SpellLib7.init65();
		SpellLib7.init66();
		SpellLib7.init67();
		SpellLib7.init68();
		SpellLib7.init69();
		SpellLib7.init70();
		

		SpellLib8.init71();
		SpellLib8.init72();
		SpellLib8.init73();
		SpellLib8.init74();
		SpellLib8.init75();
		SpellLib8.init76();
		SpellLib8.init77();
		SpellLib8.init78();
		SpellLib8.init79();
		SpellLib8.init80();
		
		SpellLib9.init81();
		SpellLib9.init82();
		SpellLib9.init83();
		SpellLib9.init84();
		SpellLib9.init85();
		SpellLib9.init86();
		SpellLib9.init87();
		SpellLib9.init88();
		SpellLib9.init89();
		SpellLib9.init90();

		SpellLib10.init91();
		SpellLib10.init92();
		SpellLib10.init93();
		SpellLib10.init94();
		SpellLib10.init95();
		SpellLib10.init96();
		SpellLib10.init97();
		SpellLib10.init98();
		SpellLib10.init99();
		SpellLib10.init100();

		SpellLib11.init101();
		SpellLib11.init102();
		SpellLib11.init103();
		SpellLib11.init104();
		SpellLib11.init105();
		SpellLib11.init106();
		SpellLib11.init107();
		SpellLib11.init108();
		SpellLib11.init109();
		SpellLib11.init110();
		
		SpellLib12.init111();
		SpellLib12.init112();
		SpellLib12.init113();
		SpellLib12.init114();
		SpellLib12.init115();
	}

	
	/**
	 * 获得单个汉字的Ascii，并用"-"连接成一个字符串
	 * 
	 * @param cn char 汉字字符
	 * @return string 错误返回 空字符串,否则返回ascii
	 */
	public static String getCnAscii(char cn) {
		byte[] bytes = (String.valueOf(cn)).getBytes();
		System.out.println(bytes.length);
		if (bytes == null || bytes.length > 2 || bytes.length <= 0) { // 错误
			return "";
		}
		if (bytes.length == 1) { // 英文字符
			return new String(bytes);
		}
		if (bytes.length == 2) { // 中文字符
			int hightByte = 256 + bytes[0];
			int lowByte = 256 + bytes[1];

			String ascii = hightByte + "-" + lowByte;

			System.out.println("ASCII=" + ascii);

			return ascii;
		}

		return ""; // 错误
	}

	/**
	 * 根据ASCII码连接成的字符串到SpellMap中查找对应的拼音
	 * 
	 * @param ascii 字符对应的ASCII连接的字符串
	 * @return String 拼音,首先判断是否是中文如果是英文直接返回字符，如果是中文返回拼音,
	 * 
	 * 否则到SpellMap中查找,如果没有找到拼音,则返回null,如果找到则返回拼音.
	 */
	public static String getSpellByAscii(String ascii) {
		if (ascii.indexOf("-") > -1)
		{
			return (String)spellMap.get(ascii);
		} else {
			return ascii;
		}
	}

	/**
	 * 返回字符串的全拼,是汉字转化为全拼,其它字符不进行转换
	 * 
	 * @param cnStr String字符串
	 * @return String 转换成全拼后的字符串
	 */
	public static String getFullSpell(String cnStr)
	{
		if (null == cnStr || "".equals(cnStr.trim())) {
			return cnStr;
		}

		char[] chars = cnStr.toCharArray();
		StringBuffer retuBuf = new StringBuffer();
		for (int i = 0, Len = chars.length; i < Len; i++) {
			String ascii = getCnAscii(chars[i]);
			if (ascii.length() == 0) { // 取ascii时出错
				retuBuf.append(chars[i]);
			} else {
				String spell = getSpellByAscii(ascii);
				if (spell == null) {
					retuBuf.append(chars[i]);
				} else {
					retuBuf.append(spell);
				} // end of if spell == null
			} // end of if ascii <= -20400
		} // end of for

		return retuBuf.toString();
	}

	/**
	 * 获取汉语字符串的声母组合，每个汉字取拼音的第一个字符组成的一个字符串
	 * @param cnStr 汉字的字符串
	 * @return 每个汉字拼音的第一个字母所组成的汉字
	 */
	public static String getFirstSpell(String cnStr)
	{
		if (null == cnStr || "".equals(cnStr.trim())) {
			return cnStr;
		}

		char[] chars = cnStr.toCharArray();
		StringBuffer retuBuf = new StringBuffer();
		for (int i = 0, Len = chars.length; i < Len; i++) {
			String ascii = getCnAscii(chars[i]);
			System.out.println(ascii);
			if (ascii.length() == 1) { // 取ascii时出错
				retuBuf.append(chars[i]);
			} else {
				
				String spell = getSpellByAscii(ascii).substring(0, 1);
				System.out.println(spell);
				if (spell == null) {
					retuBuf.append(chars[i]);
				} else {
					retuBuf.append(spell);
				} // end of if spell == null
			} // end of if ascii <= -20400
		} // end of for
		return retuBuf.toString();
	}

	public static void main(String[] args) {
		Date start = new Date();
		System.out.println(start.getTime());
		String str = null;
		str = "暗 之 幻   影";
		System.out.println("==========Spell=" + CnToSpell.getFullSpell(str));
		System.out.println("==========Spell=" + CnToSpell.getFirstSpell(str));
		Date end = new Date();
		System.out.println("===============" + (end.getTime()-start.getTime()));
	}
}
